(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define([], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node.js
        module.exports = factory();
    } else {
        // 浏览器全局变量
        root.Dialog = factory();
    }
}(typeof self !== 'undefined' ? self : this, function () {
    'use strict';

    /**
     * 弹窗组件类
     */
    function Dialog() {
        this.mask = null;
        this.container = null;
        this.isVisible = false;
        this.currentOptions = {};
        this.init();
    }

    /**
     * 初始化弹窗DOM元素
     */
    Dialog.prototype.init = function() {
        // 获取页面中已存在的弹窗元素
        this.mask = document.getElementById('dialogMask');
        if (!this.mask) {
            console.error('Dialog: 未找到弹窗容器元素 #dialogMask');
            return;
        }
        
        this.container = this.mask.querySelector('.dialog-container');
        
        // 绑定事件
        this.bindEvents();
    };

    /**
     * 绑定事件处理
     */
    Dialog.prototype.bindEvents = function() {
        var self = this;
        
        if (!this.mask) return;
        
        // 关闭按钮事件
        var closeBtn = document.getElementById('dialogClose');
        if (closeBtn) {
            closeBtn.addEventListener('click', function() {
                self.close();
            });
        }

        // 取消按钮事件
        var cancelBtn = document.getElementById('dialogCancel');
        if (cancelBtn) {
            cancelBtn.addEventListener('click', function() {
                if (self.currentOptions.onCancel) {
                    self.currentOptions.onCancel();
                }
                self.close();
            });
        }

        // 确定按钮事件
        var confirmBtn = document.getElementById('dialogConfirm');
        if (confirmBtn) {
            confirmBtn.addEventListener('click', function() {
                if (self.currentOptions.onConfirm) {
                    self.currentOptions.onConfirm();
                }
                if (!self.currentOptions.preventAutoClose) {
                    self.close();
                }
            });
        }

        // 点击蒙层关闭
        this.mask.addEventListener('click', function(e) {
            if (e.target === self.mask) {
                self.close();
            }
        });

        // ESC键关闭
        document.addEventListener('keydown', function(e) {
            if (e.key === 'Escape' && self.isVisible) {
                self.close();
            }
        });
    };

    /**
     * 打开弹窗
     * @param {Object} options 配置选项
     */
    Dialog.prototype.open = function(options) {
        if (!this.mask) {
            console.error('Dialog: 弹窗组件未正确初始化');
            return;
        }

        options = options || {};
        this.currentOptions = options;

        // 设置标题
        var titleEl = document.getElementById('dialogTitle');
        if (titleEl && options.title) {
            titleEl.textContent = options.title;
        }

        // 设置内容
        var bodyEl = document.getElementById('dialogBody');
        if (bodyEl && options.content) {
            if (typeof options.content === 'string') {
                bodyEl.innerHTML = options.content;
            } else {
                bodyEl.innerHTML = '';
                bodyEl.appendChild(options.content);
            }
        }

        // 设置按钮文本
        var cancelBtn = document.getElementById('dialogCancel');
        var confirmBtn = document.getElementById('dialogConfirm');
        
        if (cancelBtn && options.cancelText) {
            cancelBtn.textContent = options.cancelText;
        }
        
        if (confirmBtn && options.confirmText) {
            confirmBtn.textContent = options.confirmText;
        }

        // 控制按钮显示
        var footerEl = document.getElementById('dialogFooter');
        if (options.showCancel === false && cancelBtn) {
            cancelBtn.style.display = 'none';
        } else if (cancelBtn) {
            cancelBtn.style.display = '';
        }

        if (options.showConfirm === false && confirmBtn) {
            confirmBtn.style.display = 'none';
        } else if (confirmBtn) {
            confirmBtn.style.display = '';
        }

        // 如果都不显示按钮，隐藏整个footer
        if (options.showCancel === false && options.showConfirm === false) {
            footerEl.style.display = 'none';
        } else {
            footerEl.style.display = '';
        }

        // 显示弹窗
        this.mask.classList.add('show');
        this.isVisible = true;

        // 执行打开回调
        if (options.onOpen) {
            options.onOpen();
        }
    };

    /**
     * 关闭弹窗
     */
    Dialog.prototype.close = function() {
        if (!this.mask) return;
        
        this.mask.classList.remove('show');
        this.isVisible = false;

        // 执行关闭回调
        if (this.currentOptions.onClose) {
            this.currentOptions.onClose();
        }

        // 清空当前配置
        this.currentOptions = {};
    };

    // 创建单例实例
    var dialogInstance = new Dialog();

    // 静态方法
    var DialogAPI = {
        /**
         * 打开弹窗
         * @param {Object} options 配置选项
         */
        open: function(options) {
            dialogInstance.open(options);
        },

        /**
         * 关闭弹窗
         */
        close: function() {
            dialogInstance.close();
        },

        /**
         * 确认对话框
         * @param {string} message 消息内容
         * @param {Function} onConfirm 确认回调
         * @param {Function} onCancel 取消回调
         */
        confirm: function(message, onConfirm, onCancel) {
            this.open({
                title: '确认',
                content: message,
                confirmText: '确定',
                cancelText: '取消',
                onConfirm: onConfirm,
                onCancel: onCancel
            });
        },

        /**
         * 警告对话框
         * @param {string} message 消息内容
         * @param {Function} onConfirm 确认回调
         */
        alert: function(message, onConfirm) {
            this.open({
                title: '提示',
                content: message,
                confirmText: '确定',
                showCancel: false,
                onConfirm: onConfirm
            });
        }
    };

    return DialogAPI;
}));
